package com.chanchaw.service;

import com.summer.BeanPostProcessor;
import com.summer.Component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * spring 自己制作的 BeanPostProcessor
 * 同时 spring 也通过使用 BeanPostProcessor 实现AOP
 * @author chanchaw
 * @create 2022-10-11 15:12
 */
@Component
public class TestAOP implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if(beanName.equalsIgnoreCase("userService")){
            // 这里是用了 java 的 Proxy，所以测试程序入口方法中的强制转换类型 UserService 需要更换为 UserInterface
            // 如果使用了 cglib 做代理则可仍然使用 UserService
            Object proxyInstance = Proxy.newProxyInstance(TestAOP.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("模拟AOP执行bean原方法前的切面");
                    return method.invoke(bean, args);
                }
            });

            return proxyInstance;
        }
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}
